package com.itheima.sky.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itheima.sky.dao.CategoryMapper;
import com.itheima.sky.dao.DishMapper;
import com.itheima.sky.dao.SetMealMapper;
import com.itheima.sky.entity.Page;
import com.itheima.sky.entity.PageResult;
import com.itheima.sky.pojo.Category;
import com.itheima.sky.service.CategoryService;
import com.itheima.sky.utils.BaseException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

/**
 * @Description CategoryServiceImpl
 * @Author jiangning
 * @Date 2024-06-28
 */
@Service
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    CategoryMapper categoryMapper;
    @Override
    public List<Category> getAllCates() {
        return categoryMapper.getAllCates();
    }

    @Autowired(required = false)
    private DishMapper dishMapper;

    @Autowired(required = false)
    private SetMealMapper setMealMapper;





    @Override
    public void save(Category category) {
        //1. 补全参数
        category.setCreateTime(LocalDateTime.now());
        category.setUpdateTime(LocalDateTime.now());

        //1L到时更改为登录人id
        category.setCreateUser(1L);
        category.setUpdateUser(1L);
        categoryMapper.save(category);
    }


    @Override
    public Page<Category> findByPage(Integer page, Integer pageSize) {
        //1. 设置当前页与页面大小
        PageHelper.startPage(page, pageSize);
        //2. 查询数据出来
        List<Category> categoryList = categoryMapper.findAll();

        //3. 把集合封装到PageInfo对象
        PageInfo<Category> pageInfo = new PageInfo<>(categoryList);

        //4. 把Pageinfo的数据封装到page对象中
        Page<Category> pageResult = new Page<>(pageInfo.getList(), pageInfo.getTotal(), pageSize, page);

        return pageResult;
    }



    /**
     * 根据id删除分类
     * @param id 分类id
     */
    @Override
    public void removeById(Long id) {
        categoryMapper.deleteById(id);
    }



    /**
     * 作用： 根据id删除类别
     * @param id
     * @return
     */
    @Override
    public void deleteById(Long id) {
        //1. 查询当前类别是否关联有菜品 ，返回的是菜品的总数
        long count = dishMapper.findDishCountByCategoryId(id);
        if(count>0){
            throw new RuntimeException("该类别关联了菜品，无法删除");  //异常类的作用：通知你当前程序出现何种类型问题，一类名有见名般异常知意的意思。 NullPointerException  WifiException
        }

        //2. 查询当前套餐是否关联有菜品
        count = setMealMapper.findSetMealByCategoryId(id);
        if(count>0){
            throw new RuntimeException("该类别关联了套餐，无法删除");  //异常类的作用：通知你当前程序出现何种类型问题，一类名有见名般异常知意的意思。 NullPointerException  WifiException
        }


        categoryMapper.deleteById(id);
    }


    /**
     * 作用：修改类别
     * @param category
     * @return
     */
    @Override
    public void updateById(Category category) {
        category.setUpdateTime(LocalDateTime.now());
        categoryMapper.updateById(category);
    }



    /**
     * 查询所有分类数据
     * @return List
     */
    public List<Category> findAll(){
        return categoryMapper.findAll();
    }



    //pan
    /**
     * 作用：根据Type查询类别集合
     * @param type  类别的type
     * @return
     */
    @Override
    public List<Category> list(Integer type) {
        return categoryMapper.list(type);
    }

    @Override
    public void saveP(Category category) {
        //1. 补全参数
        category.setCreateTime(LocalDateTime.now());
        category.setUpdateTime(LocalDateTime.now());
        categoryMapper.saveP(category);
    }

    @Override
    public Page<Category> findByPageP(Integer page, Integer pageSize) {
        //1. 设置当前页与页面大小
        PageHelper.startPage(page,pageSize);
        //2. 查询数据出来
        List<Category> categoryList = categoryMapper.findAll();

        //3. 把集合封装到PageInfo对象
        PageInfo<Category> pageInfo = new PageInfo<>(categoryList);

        //4. 把Pageinfo的数据封装到page对象中
        Page<Category> pageResult = new Page<>(pageInfo.getList(),pageInfo.getTotal(),pageSize,page);

        return pageResult;
    }

    /**
     * 作用： 根据id删除类别
     * @param id
     * @return
     */
    @Override
    public void removeByIdP(Long id) {
        //1. 查询当前类别是否关联有菜品 ，返回的是菜品的总数
        long count = dishMapper.findDishCountByCategoryId(id);
        if(count>0){
            throw new BaseException("该类别关联了菜品，无法删除");  //异常类的作用：通知你当前程序出现何种类型问题，一类名有见名般异常知意的意思。 NullPointerException  WifiException
        }

        //2. 查询当前套餐是否关联有菜品
        count = setMealMapper.findSetMealByCategoryId(id);
        if(count>0){
            throw new BaseException("该类别关联了套餐，无法删除");  //异常类的作用：通知你当前程序出现何种类型问题，一类名有见名般异常知意的意思。 NullPointerException  WifiException
        }


        categoryMapper.deleteById(id);
    }
    /**
     * 作用：修改类别
     * @param category
     * @return
     */
    @Override
    public void updateByIdP(Category category) {
        category.setUpdateTime(LocalDateTime.now());
        categoryMapper.updateById(category);
    }

    /**
     * 查询所有分类数据
     * @return List
     */
    public List<Category> findAllP(){
        return categoryMapper.findAll();
    }


    //o

    @Override
    public PageResult<Category> findCategoryAll(Integer page, Integer pageSize) {

        //1. 查询分类数据
        List<Category> categoryList = categoryMapper.findCategoryList();

        //PageHelper设置查询第几页和每页显示条数
        PageHelper.startPage(page,pageSize);


        //将集合封装到PageInfo中
        PageInfo<Category> pageInfo = new PageInfo<>(categoryList);

        //将ageInfo的数据封装到page对象中去
        PageResult<Category> pageResult = new PageResult<>(pageInfo.getTotal(),pageInfo.getList());

        //3. 返回数据
        return pageResult;

    }

    /**
     * 根据Type查询类别集合
     *
     * @param type
     * @return
     */
    @Override
    public List<Category> findSetmealList(Integer type) {

        //根据type值来获取分类

        return categoryMapper.findList(type);
    }

    
}
